/**
 * WBS表示ページjs
 */
if (typeof App.ProjectListWbs == 'undefined') {


App.ProjectListWbs = function()
{
    // スーパークラスコンストラクタ呼び出し
    App.ProjectListWbs.superclass.constructor.call(this);
};

var project_list_wbs = {

    /**
     * onDocLoaded
     * ページ初期化
     */
    onDocLoaded : function(eventObject, target)
    {
        // スーパークラスの処理を実行
        App.ProjectListWbs.superclass.onDocLoaded.call(this, eventObject, target);

        this.fncInitializeListWbsGrid();
        this.fncRender();// ページレンダリング
        this.fncSetEvent();// 各イベント設定
        this.fncListLoad();// データロード
    },

    /*
     * WBS list
     */

    /**
     * onListLoadSuccess
     * WBSデータ取得後のコールバック関数
     * データ取得に成功していたらWBSリストの描画を行う
     */
    onListLoadSuccess : function(obj)
    {
        var responseobj = Ext.util.JSON.decode(obj.responseText);

        var success = responseobj.success;
        var message = responseobj.message;
        if (success) {
            var resultobj = responseobj.result;
            App.ListWbsGrid.fncResetWbsList(resultobj.items);
         } else {
            alert(message);
         }
    },

    /**
     * onListLoadFail
     * データ取得失敗時のコールバック処理
     * 特に何もしない
     */
    onListLoadFail : function(obj)
    {
    },

    onListDblClick : function()
    {
        // @TODO : アイテムダブルクリック時の処理を書く
        var index    = App.ListWbsGrid.fncGetAttribute('selectedIndex');
        var task_kbn = App.ListWbsGrid.fncGetRowAttribute(index, 'task_kbn');
        
        var elm ;
        if( task_kbn != null ){
            switch( Number(task_kbn) ){
                case 1 :
                    this.onEditTaskClick() ;
                    break ;
                case 2 :
                    this.onEditMilestoneClick() ;
                    break ;
                case 3 :
                    this.onEditEventClick() ;
                    break ;
                default :
                    break ;
            }
        }    
    },



    /*
     * Task
     */

    /*
     * 関数名：onNewTaskClick
     * 概　要：タスク追加リンククリックイベント
     *         タスク追加ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onClickNewTask : function(target_url)
    {
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"]          = "";
            initparam["dataparam"]["project_id"]  = project_id ;
            initparam["dataparam"]["base_id"]     = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"] = [this.onTaskSave_callback.createDelegate(this)];
	        initparam["on_close"] = [this.onTaskClose_callback.createDelegate(this)];
    
            // タスク追加ダイアログ表示
            this.dialogs.TaskDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
        }
    },

    /**
     * 関数名：onEditTaskClick
     * 概　要：タスク編集リンククリックイベント
     *         タスク編集ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEditTaskClick : function(target_url)
    {
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"] = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["project_id"] = project_id ;
            initparam["dataparam"]["base_id"] = "";
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"] = [this.onTaskSave_callback.createDelegate(this)];
	        initparam["on_destroy"] = [this.onTaskDestroy_callback.createDelegate(this)];
	        initparam["on_close"] = [this.onTaskClose_callback.createDelegate(this)];

            // タスク追加ダイアログ表示
            this.dialogs.TaskDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
        }
    },
    
    /**
     * onTaskSave_callback
     * タスク保存完了イベント
     * リストのリロードを実施する。
     */
    onTaskSave_callback : function()
    {
        // プロジェクトリストをリロード
        this.fncListLoad();
    },

    /*
     * onTaskDestroy_callback
     * タスク削除完了イベント
     *  リストのリロードを実施する。
     */
    onTaskDestroy_callback : function()
    {
        // プロジェクトリストをリロード
        this.fncListLoad();
    },

    /**
     * onTaskClose_callback
     * ダイアログを閉じた場合の後処理を実施する。
     * 単に閉じられただけのときは何もしない
     */
    onTaskClose_callback : function()
    {
    },

    onListUpItem : function(){
        this.fncSetOrder(-1) ;
    },
    onListDownItem : function(){
        this.fncSetOrder(1) ;
    },








    /**
     * fncInitializeListWbsGrid
     */
    fncInitializeListWbsGrid : function()
    {
        initparam = {
            callback : {
                on_dblclick : [ this.onListDblClick.createDelegate(this) ],
                on_upitem   : [ this.onListUpItem.createDelegate(this) ],
                on_downitem : [ this.onListDownItem.createDelegate(this) ]
            }
        };
        App.ListWbsGrid.fncSetInitParameter(initparam);
    },

    /**
     * fncRender
     * 初期化時描画処理
     */
    fncRender : function()
    {
        App.ListWbsGrid.fncRender();
    },

    /**
     * fncSetEvent
     * 当該ページのイベントハンドラを設定する
     */
    fncSetEvent : function()
    {
        // タスク追加ボタンクリックイベント設定
        Ext.get('list_wbs_btn_add_task').on('click', this.onClickNewTask, this, true);
        // イルストーンボタンクリックイベント設定
        Ext.get('list_wbs_btn_add_milestone').on('click', this.onNewMilestoneClick, this, true);
        // イベントボタンクリックイベント設定
        Ext.get('list_wbs_btn_add_event').on('click', this.onNewEventClick, this, true);
    },



    /*
     * 関数名：initialize
     * 概　要：初期化処理（newで生成した際に呼び出される）
     * 引　数：param        mixed    初期化パラメータ
     * 戻り値：なし
     */
    initialize: function( initparam )
    {
        this.fncSetInitParameter( initparam ) ;
        this.fncInitialize();
    },


    /*
     * 関数名：fncSetInitParameter
     * 概　要：初期化パラメータをセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncSetInitParameter: function( initparam )
    {
        if( initparam != null){
            this.initparam = this.initparam.merge(initparam) ;
        }
        
        // initparamの内容で、メンバー値を初期化
        var keys = this.initparam.keys().toString() ;
        if( keys != "" ){
            var keysarr = keys.split(',') ;
            for( i in keysarr ){
                this[keysarr[i]] = this.initparam[keysarr[i]] ;
            }
        }
    },

    /*
     * 関数名：fncInitialize
     * 概　要：ダイアログ初期化処理を行う（初期化時に呼び出される）
     * 引　数：なし
     * 戻り値：なし
     */
    fncInitialize: function()
    {
        // サブクラスにて必要な際に実装
    },
    
    fncListLoad : function()
    {
        var url = url_for("/project/json_list_for_wbs");
        //alert(url);
        var opt = {
            url     : url,
            success : this.onListLoadSuccess,
            failure : this.onListLoadFail,
            scope   : this,
            method  : 'GET'
        };
        Ext.Ajax.request(opt);
    },



    /*
     * 関数名：onNewClick
     * 概　要：新規リンククリックイベント。
     *         新規プロジェクトページへ遷移する。
     * 引　数：target_url   string      遷移先URL
     * 戻り値：なし
     */
    onNewClick : function(target_url){
    
        var form = document.navigation ;
        
        form.action = target_url ;
        form.submit() ;
    
    },
    
    /*
     * 関数名：onEditClick
     * 概　要：編集リンククリックイベント。
     *         プロジェクト編集ページへ遷移する。
     * 引　数：target_url   string      遷移先URL
     * 戻り値：なし
     */
    onEditClick : function(target_url){
    
        var form = document.navigation ;
        
        // プルダウン選択中のプロジェクトIDを取得
        var id   =this.fncSelectedProjectIdGet() ;
    
        form.action = target_url + "/" + id ;
        form.submit() ;
    
    },
    
    /*
     * 関数名：onDelClick
     * 概　要：削除リンククリックイベント。
     *         プロジェクト削除アクションを実施する
     * 引　数：target_url   string      削除アクションURL
     * 戻り値：なし
     */
    onDelClick : function(target_url){
    
        var form = document.navigation ;
        var id   = this.fncSelectedProjectIdGet() ;
        
        form.action = target_url + "/" + id ;
        form.submit() ;
    
    },
    
    /*
     * 関数名：onNewMilestoneClick
     * 概　要：マイルストーン追加リンククリックイベント
     *         マイルストーン追加ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onNewMilestoneClick : function(){
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"] = "";
            initparam["dataparam"]["project_id"] = project_id ;
            initparam["dataparam"]["base_id"]     = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"] = [this.onMilestoneSave_callback.createDelegate(this)];
	        initparam["on_close"] = [this.onMilestoneClose_callback.createDelegate(this)];

            // タスク追加ダイアログ表示
            this.dialogs.MilestoneDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
            alert(e.message) ;
        }
    },
    
    /*
     * 関数名：onEditMilestoneClick
     * 概　要：タスク編集リンククリックイベント
     *         タスク編集ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEditMilestoneClick : function(target_url){
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"] = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["project_id"] = project_id ;
            initparam["dataparam"]["base_id"] = "";
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"] = [this.onMilestoneSave_callback.createDelegate(this)];
	        initparam["on_destroy"] = [this.onMilestoneDestroy_callback.createDelegate(this)];
	        initparam["on_close"] = [this.onMilestoneClose_callback.createDelegate(this)];

            // タスク追加ダイアログ表示
            this.dialogs.MilestoneDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
        }
    },
    
    /*
     * 関数名：onMilestoneSave_callback
     * 概　要：マイルストーン保存完了イベント
     *         リストのリロードを実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onMilestoneSave_callback : function(){
        // プロジェクトリストをリロード
        this.fncListLoad() ;
    },
    
    /*
     * 関数名：onMilestoneDestroy_callback
     * 概　要：マイルストーン削除完了イベント
     *         リストのリロードを実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onMilestoneDestroy_callback : function(){
        // プロジェクトリストをリロード
        this.fncListLoad() ;
    },
    
    /*
     * 関数名：onMilestoneClose_callback
     * 概　要：マイルストーンダイアログクローズイベント
     *         ダイアログを閉じた場合の後処理を実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onMilestoneClose_callback : function(){
    },
    
    /*
     * 関数名：onNewEventClick
     * 概　要：イベント追加リンククリックイベント
     *         イベント追加ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onNewEventClick : function(target_url){
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"] = "";
            initparam["dataparam"]["project_id"] = project_id ;
            initparam["dataparam"]["base_id"] = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"] = [this.onEventSave_callback.createDelegate(this)];
	        initparam["on_close"] = [this.onEventClose_callback.createDelegate(this)];
    
            // タスク追加ダイアログ表示
            this.dialogs.EventDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
        }
    },
    
    /*
     * 関数名：onEditEventClick
     * 概　要：イベント編集リンククリックイベント
     *         イベント編集ダイアログを表示する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEditEventClick :  function(target_url){
        try{
            // 現在の選択情報をエレメントにセット
            this.fncSetListObj() ;
            
            // パラメータハッシュ生成
            var initparam = {};
        
            // アニメーション元エレメントIDの設定（指定しなくてもよい）
            initparam["base_id"] = "pro_index_list_body" ;
            
            // データパラメータの設定
            var project_id = this.fncSelectedProjectIdGet() ;
            initparam["dataparam"] = {};
            initparam["dataparam"]["id"]          = Ext.get('base_id').dom.value ;
            initparam["dataparam"]["project_id"]  = project_id ;
            initparam["dataparam"]["base_id"]     = "";
            initparam["dataparam"]["class_word1"] = Ext.get('class_word1').dom.value ;
            initparam["dataparam"]["class_word2"] = Ext.get('class_word2').dom.value ;
            initparam["dataparam"]["class_word3"] = Ext.get('class_word3').dom.value ;
        
            // コールバックの設定（指定しなくてもよい）
	        initparam["on_save"]    = [this.onEventSave_callback.createDelegate(this)];
	        initparam["on_destroy"] = [this.onEventDestroy_callback.createDelegate(this)];
	        initparam["on_close"]   = [this.onEventClose_callback.createDelegate(this)];

            // タスク追加ダイアログ表示
            this.dialogs.EventDlgIndex.fncShowDialog(initparam) ;
        }
        catch(e){
        }
    },
    
    /*
     * 関数名：onEventSave_callback
     * 概　要：イベント保存完了イベント
     *         リストのリロードを実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEventSave_callback :  function(){
        // プロジェクトリストをリロード
        this.fncListLoad() ;
    },
    
    /*
     * 関数名：onEventDestroy_callback
     * 概　要：イベント削除完了イベント
     *         リストのリロードを実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEventDestroy_callback : function(){
        // プロジェクトリストをリロード
        this.fncListLoad() ;
    },
    
    /*
     * 関数名：onEventClose_callback
     * 概　要：イベントダイアログクローズイベント
     *         ダイアログを閉じた場合の後処理を実施する。
     * 引　数：なし
     * 戻り値：なし
     */
    onEventClose_callback : function(){
    },
    
    /*
     * 関数名：fncSelectedProjectIdGet
     * 概　要：プロジェクト選択プルダウンでの
     *         現在選択されているプロジェクトのIDを取得する
     * 引　数：なし
     * 戻り値：string       プロジェクトID
     */
    fncSelectedProjectIdGet : function(){
        return Ext.get('remote_project_id').dom.value ;
    },
    
    
    /*
     * 関数名：fncSetListObj
     * 概　要：選択中のリスト情報から、必要な情報を該当エレメントにセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncSetListObj : function(){
        var index    = App.ListWbsGrid.fncGetAttribute('selectedIndex');

        var elm ;
        if( index != null || index < 0 ){
            var id = App.ListWbsGrid.fncGetRowAttribute(index, 'id');
            var class_word1 = App.ListWbsGrid.fncGetRowAttribute(index, 'class_word1');
            var class_word2 = App.ListWbsGrid.fncGetRowAttribute(index, 'class_word2');
            var class_word3 = App.ListWbsGrid.fncGetRowAttribute(index, 'class_word3');
    
            elm = Ext.get('base_id').dom;
            elm.value = id==null ? "" : id ;
            elm = Ext.get('class_word1').dom;
            elm.value = class_word1==null ? "" : class_word1 ;
            elm = Ext.get('class_word2').dom;
            elm.value = class_word2==null ? "" : class_word2 ;
            elm = Ext.get('class_word3').dom;
            elm.value = class_word3==null ? "" : class_word3 ;
        }
        else{
            elm = Ext.get('base_id').dom;
            elm.value = "";
            elm = Ext.get('class_word1').dom;
            elm.value = "";
            elm = Ext.get('class_word2').dom;
            elm.value = "";
            elm = Ext.get('class_word3').dom;
            elm.value = "";
        }
    },

    onListUpItem : function()
    {
        this.fncSetOrder(-1) ;
    },
    onListDownItem : function()
    {
        this.fncSetOrder(1) ;
    },

    /**
     * fncSetOrder
     * リストの並び順を変更
     */
    fncSetOrder : function(offset)
    {
        var grid = App.ListWbsGrid.elm_grid;
        var selmodel = grid.getSelectionModel();
        var selected = selmodel.getSelected();

        if( selected == undefined ) return false ; //リスト未選択時は変更中止

        var selected_id = selected.get('id');
        var items       = grid.store.data.items;
        var key_len     = items.length;
        var index       = 0;
        for (var i=0; i<key_len; i++) {
            var key_id = items[i].get('id');
            if (key_id == selected_id) {
                var index = i;
                break;
            }
        }
        var id    = selected.get('id');
        
        try {
            var opt = {
                url    : url_for('/projectcomp/item_order_update'),
                params : {
                    id     : id,
                    offset : offset
                },
                success : this.onSetOrderSuccess ,
                failure : this.onSetOrderFail,
                method  : 'post',
                scope   : this
            }
            Ext.Ajax.request(opt);
        } catch (e) {
            alert(e.message);
        }
    },
    
    onSetOrderSuccess : function(obj)
    {
        var responseobj = Ext.util.JSON.decode(obj.responseText);

        var success = responseobj.success;
        var message = responseobj.message;
        if (success) {
            var resultobj = responseobj.result;
            App.ListWbsGrid.fncResetWbsList(resultobj.items);
            this.fncListLoad() ;
         } else {
            alert(message);
         }
    },
    
    onSetOrderFail : function(obj)
    {
    }

};

// App.Pageを継承
Ext.extend(App.ProjectListWbs, App.Page, project_list_wbs);

//=============================
// 現在のページオブジェクトとして生成
//=============================
App.Page.thispage = new App.ProjectListWbs() ;

}
